#ifndef SUPPLIER_H
#define SUPPLIER_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h> // For potential FILE* usage in implementation

// 定义字符串字段的最大长度
#define SUPPLIER_NAME_LEN 128
#define SUPPLIER_CONTACT_LEN 64
#define SUPPLIER_PHONE_LEN 32
#define SUPPLIER_ADDRESS_LEN 256

// 供应商信息结构体
typedef struct {
    int id;                                 // Unique Supplier ID
    char name[SUPPLIER_NAME_LEN];           // Supplier Company Name
    char contact_person[SUPPLIER_CONTACT_LEN]; // Contact Person's Name
    char phone[SUPPLIER_PHONE_LEN];         // Contact Phone Number
    char address[SUPPLIER_ADDRESS_LEN];     // Supplier Address
    // 根据需要添加其他相关字段，例如：
    // char email[128]; // 电子邮件
    // char website[256]; // 网站
    // char notes[512]; // 备注
} Supplier;

// 供应商链表节点结构体
typedef struct SupplierNode {
    Supplier data;
    struct SupplierNode* next;
} SupplierNode;

// --- 供应商管理函数声明 ---

// 从文件加载供应商到链表。返回加载的供应商数量。
int load_suppliers(const char* filename, SupplierNode** head);

// 将链表中的供应商保存到文件。返回保存的供应商数量。
int save_suppliers(const char* filename, SupplierNode* head);

// 向链表中添加新供应商。成功返回1，ID已存在返回0。
int add_supplier(SupplierNode** head, const Supplier* new_supplier);

// 从链表中删除指定ID的供应商。成功返回1，未找到返回0。
int delete_supplier(SupplierNode** head, int supplier_id);

// 按ID查找供应商。找到返回节点指针，否则返回NULL。
SupplierNode* find_supplier_by_id(SupplierNode* head, int supplier_id);

// 更新现有供应商的信息。成功返回1，未找到返回0。
int update_supplier(SupplierNode* head, const Supplier* updated_supplier);

// 释放供应商链表分配的内存。
void free_all_suppliers(SupplierNode* head);

// (可选：稍后添加查询函数，例如按名称查找供应商)

// --- 数据验证函数声明 ---

// 验证供应商ID：纯数字，1-6位
int validate_supplier_id_field(int id);

// 验证供应商名称：中英文，1-50字符，拒绝特殊符号（空格除外）
int validate_supplier_name(const char* name);

// 验证联系人：中英文，1-30字符，拒绝特殊符号（空格除外）
int validate_supplier_contact(const char* contact);

// 验证电话：数字、连字符、空格、括号，最多20字符
int validate_supplier_phone(const char* phone);

// 验证地址：中英文+数字，最大100字符，拒绝恶意脚本
int validate_supplier_address(const char* address);

// 完整验证供应商数据
int validate_supplier_data(const Supplier* supplier, char* error_msg, int error_msg_size);

#ifdef __cplusplus
}
#endif

#endif // SUPPLIER_H